import adder from './Adder';
import { subtract as _subtract } from './Subtraction';
import divider from './Divide.js';
import multiply from './ElementMultiply';
import matrixMultiply from './MatrixMultiply.js';
import { power as _power } from './Power.js';
import miscellaneousFunction from './Miscellaneous';
import { mean as _mean, square as _square, sum as _sum, totalElements as _totalElements, findHighestElement, findLowestElement, findRange, findMedian, findFrequency, findPopulationStandardDeviation, findPopulationVariance, findSampleStandardDeviation, findSampleVariance, findAllFrequency, findMode } from './Statistics.js';
import exp from './exp.js';
import { sin as _sin, cos as _cos, tan as _tan, sinInverse as _sinInverse, cosInverse as _cosInverse, tanInverse as _tanInverse, hyperbolicSine as _hyperbolicSine, hyperbolicCosine as _hyperbolicCosine, hyperbolicTangent as _hyperbolicTangent } from './TrignometricFunctions.js';
import complexMatrixOperations from './ComplexMatrixOperation.js';
import logarithm from './Log.js';
import { squareRoot as _squareRoot, nThRoot as _nThRoot, cubeRoot as _cubeRoot } from './root.js';
import { arange as _arange, linspace as _linspace } from "./NumericalRange.js";

var NumpyJS = (
  function() {
    return {
      add: adder.add,
      subtract: _subtract,
      divide: divider.divide,
      multiply: multiply.ElementMultiply,
      matrixMultiply: matrixMultiply.matrixMultiply,
      generateRandomNumbers: miscellaneousFunction.generateRandomNumbers,
      get_Dimensions: miscellaneousFunction.get_Dimensions,
      fillWithNumber: miscellaneousFunction.fillWithNumber,
      flatten: miscellaneousFunction.flatten,
      reshape: miscellaneousFunction.reshape,
      negative: miscellaneousFunction.negative,
      abs: miscellaneousFunction.abs,
      copy: miscellaneousFunction.copy,
      mean: _mean,
      square: _square,
      sum: _sum,
      totalElements: _totalElements,
      highestElement: findHighestElement,
      lowestElement: findLowestElement,
      range: findRange,
      median: findMedian,
      frequency: findFrequency,
      populationStandardDeviation: findPopulationStandardDeviation,
      populationVariance: findPopulationVariance,
      sampleStandardDeviation: findSampleStandardDeviation,
      sampleVariance: findSampleVariance,
      allFrequency: findAllFrequency,
      mode: findMode,
      power: _power,
      exp: exp.exp,
      sin: _sin,
      cos: _cos,
      tan: _tan,
      sinInverse: _sinInverse,
      cosInverse: _cosInverse,
      tanInverse: _tanInverse,
      hyperbolicSine: _hyperbolicSine,
      hyperbolicCosine: _hyperbolicCosine,
      hyperbolicTangent: _hyperbolicTangent,
      transpose: complexMatrixOperations.transpose,
      determinant: complexMatrixOperations.findDeterminant,
      generateIdentityMatrix: complexMatrixOperations.generateIdentityMatrix,
      matrixInverse: complexMatrixOperations.matrixInverse,
      log10: logarithm.log10,
      logE: logarithm.logE,
      log: logarithm.log,
      squareRoot: _squareRoot,
      nThRoot: _nThRoot,
      cubeRoot: _cubeRoot,
      arange: _arange,
      linspace: _linspace
    }
  }
);

export default NumpyJS();
